<?php

namespace app\common\model\virtual;

use app\common\model\BaseModel;
use think\facade\Db;

/**
 * 虚码活动特殊规则
 * Class VirtualPromoSpecial
 * @package app\common\model\virtual
 */
class VirtualPromoSpecialModel extends BaseModel
{
    //
    protected $name = 'virtual_promo_special';

    protected $json = ['limit_way'];

    // 序号
    public string $fieldId = 'id';
    // 虚码活动ID
    public string $fieldVpId = 'vp_id';
    // 限制方式 0无效,1:标签,2:门店,3:导购
    public string $fieldType = 'type';
    // 适用对象:["xx1","xx2",....]
    public string $fieldLimitWay = 'limit_way';
    // 是否需要小票, 1:需要 0:不需要
    public string $fieldSmallTicket = 'small_ticket';
    // 红包金额
    public string $fieldRedPacket = 'red_packet';
    // 积分
    public string $fieldPoint = 'point';
    // 状态 1:正常,0:禁用
    public string $fieldStatus = 'status';
    // 操作人
    public string $fieldOpUser = 'op_user';
    // 创建时间
    public string $fieldCreateAt = 'create_at';
    // 更新时间
    public string $fieldUpdateAt = 'update_at';

    // 设置字段信息
    protected $schema = [
        'id' => 'int',        // 序号
        'vp_id' => 'int',        // 虚码活动ID
        'type' => 'int',        // 限制方式 0无效,1:标签,2:门店,3:导购
        'limit_way' => 'json',        // 适用对象:["xx1","xx2",....]
        'small_ticket' => 'int',        // 是否需要小票, 1:需要 0:不需要
        'red_packet' => 'float',        // 红包金额
        'point' => 'int',        // 积分
        'status' => 'int',        // 状态 1:正常,0:禁用
        'op_user' => 'int',        // 操作人
        'create_at' => 'datetime',        // 创建时间
        'update_at' => 'datetime',        // 更新时间
    ];

    /**
     * 获取指定活动中特殊规则的数量
     * @param array $vpids 活动ID
     * @return array
     */
    public function getNums(array $vpids): array
    {
        return $this->db()->whereIn('vp_id', $vpids)->group('vp_id')->column('count(id)', 'vp_id');
    }


    /**
     * 检测 给定ID是否存在, 存在的返回存在的名称,
     * @param int   $vpId 活动ID
     * @param int   $type 限制类型
     * @param array $ids 限制的ID
     * @param int   $recId 限制是排序的ID
     * @return void
     */
    public function getExistLimitWayTitle(int $vpId, int $type, array $ids, int $recId = 0): string
    {
        $result = '';
        if (!empty($ids)) {
            $tbName = $this->db()->getTable();
            $default = "SELECT array_to_string( array_agg(DISTINCT arr.item_object::jsonb->>'title'),',') as result  
                        FROM %s,jsonb_array_elements(limit_way) with ordinality arr(item_object, position) 
                        WHERE vp_id=%d and type=%d and id!=%d and  cast(arr.item_object::jsonb->>'id' as int) in(%s)";
            $sql = sprintf($default, $tbName, $vpId, $type, $recId, implode(',', $ids));
            $resultSet = Db::query($sql);
            $result = current($resultSet)['result'];
            $result = $result ?? '';
        }
        return $result;


    }
}
